package cn.lzd.mvp.base.struct;

import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.disposables.Disposable;

import java.lang.reflect.ParameterizedType;

//BasePresenter 两个泛型，前者为视图的，后者为数据源的
public abstract class BasePresenter<V extends IView, M extends IModel> implements IPresenter {

    protected V mView;//V 泛型变量
    protected M mModel;//M 泛型变量

    // 这是一个集合，用来控制生命周期
    private CompositeDisposable compositeDisposable;

    @SuppressWarnings("unchecked")
    public BasePresenter(V mView) {
        this.mView = mView;
        // 保存了上级 View
        try {
            // 一个泛型Model 实例
            ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();
            if (type == null) {
                throw new RuntimeException("运行异常，初始化失败: " + getClass().getSimpleName());
            }
            Class<M> classM = (Class<M>) type.getActualTypeArguments()[1];
            this.mModel = (M) classM.getConstructors()[0].newInstance(this);
        } catch (Exception e) {
            e.printStackTrace();
        }
        compositeDisposable = new CompositeDisposable();
    }

    //从子管理传参到这里，再for循环出来数据 给compositeDisposable
    public void addDisposable(Disposable... disposables) {
        if (compositeDisposable == null) {
            return;
        }
        for (Disposable disposable : disposables) {
            compositeDisposable.add(disposable);
        }
    }

    @Override
    public void onDestroy() {
        mView = null;
        if (mModel != null) {
            mModel.onDestroy();//不等于空，就销毁
            mModel = null;
        }
        // 在合适的时机取消未结束的网络请求
        // 取消所有未完成的网络请求
        // 因为视图已经销毁了，如果继续下去，会崩溃
        if (compositeDisposable != null) {
            compositeDisposable.dispose();
            compositeDisposable = null;
        }
    }
}
